module BCD # (
    parameter WIDTH = 16                    //输入二进制数位数
)
(
    input       [WIDTH-1:0]      hex,       //输入二进制数
    output  reg [WIDTH+3:0]      bcd        //输出BCD码
);

    reg [WIDTH-1:0] hex_reg;                // 定义寄存器中间变量，用于缓存输入的二进制数
    integer i;                              // 循环次数，WIDTH
    integer j;                              // 十进制位数
    reg [3:0] t;                            // 保存加3的临时值

    always @ (*) begin
        // 初始化
        hex_reg             = hex;          // 把待转换的二进制数存入缓存寄存器
        bcd                 = 0;

        //开始循环转换
        for (i = WIDTH; i > 0; i--) begin   // 循环WIDTH次
            for (j = 0; j <= WIDTH/4; j++) begin
                if(bcd[j*4 +: 4] >= 5) begin
                    t = bcd[j*4 +: 4] + 3;
                    bcd[j*4 +: 4] = t;
                end
            end
            
            bcd = bcd << 1;
            bcd[0] = hex_reg[WIDTH-1];

            hex_reg = {hex_reg[WIDTH-2:0], 1'b0};
        end
    end

endmodule